package com.merry.event;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

/**
 * 接口：它的实现类可以管理 {@link ApplicationListener} 实现类和发布事件。
 * 一个 {@link org.springframework.context.ApplicationEventPublisher} 实现类，可以去发布一个事件，这个事件会流转到当前接口中处理。
 */
public interface ApplicationEventMulticaster {

    /**
     * 添加一个监听器来接收所有的事件通知。
     */
    void addApplicationListener(ApplicationListener<?> listener);

    /**
     * 添加一个监听器来接收所有的事件，只是这个监听器需要被spring容器管理。
     */
    void addApplicationListenerBean(String listenerBeanName);

    /**
     * 删除一个监听器。
     */
    void removeApplicationListener(ApplicationListener<?> listener);

    /**
     * 删除一个监听器。
     */
    void removeApplicationListenerBean(String listenerBeanName);

    /**
     * 删除所有的监听器。
     */
    void removeAllListeners();

    /**
     * 向所有的监听器广播一个事件。
     */
    void multicastEvent(ApplicationEvent event);

    /**
     * 向所有的监听器广播一个事件。
     */
    void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType);

}
